home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / ibus-table / engine / tabcreatedb.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  10KB  |  262 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import sys
  6. sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  7. import tabsqlitedb
  8. import bz2
  9. import re
  10. from optparse import OptionParser
  11. opt_parser = OptionParser()
  12. opt_parser.add_option('-n', '--name', action = 'store', dest = 'name', default = None, help = 'set the database name we will use, default is %default')
  13. opt_parser.add_option('-s', '--source', action = 'store', dest = 'source', default = 'xingma.txt.bz2', help = 'tell me which file is the source file of IME, default is %default')
  14. opt_parser.add_option('-e', '--extra', action = 'store', dest = 'extra', default = '', help = 'tell me which file is the extra words file for IME, default is %default')
  15. opt_parser.add_option('-p', '--pinyin', action = 'store', dest = 'pinyin', default = '/usr/share/ibus-table/data/pinyin_table.txt.bz2', help = 'tell me which file is the source file of pinyin, default is %default')
  16. opt_parser.add_option('-o', '--no-create-index', action = 'store_false', dest = 'index', default = True, help = 'do not create index on database, only for distrubution purpose, normal user should not invoke this flag!')
  17. opt_parser.add_option('-i', '--create-index-only', action = 'store_true', dest = 'only_index', default = False, help = 'only create index on exist database')
  18. opt_parser.add_option('-d', '--debug', action = 'store_true', dest = 'debug', default = False, help = 'print extra debug messages')
  19. (opts, args) = opt_parser.parse_args()
  20. if not (opts.name) and opts.only_index:
  21.     print 'Please give me the database you want to create index on'
  22.     sys.exit(2)
  23.  
  24. if not opts.name:
  25.     opts.name = os.path.basename(opts.source).split('.')[0] + '.db'
  26.  
  27.  
  28. def main():
  29.     
  30.     def debug_print(message):
  31.         if opts.debug:
  32.             print message
  33.         
  34.  
  35.     if not opts.only_index:
  36.         
  37.         try:
  38.             os.unlink(opts.name)
  39.  
  40.     
  41.     debug_print('Processing Database')
  42.     db = tabsqlitedb.tabsqlitedb(filename = opts.name)
  43.     
  44.     def parse_source(f):
  45.         _attri = []
  46.         _table = []
  47.         _gouci = []
  48.         patt_com = re.compile('^###.*')
  49.         patt_blank = re.compile('^[ \\t]*$')
  50.         patt_conf = re.compile('.*=.*')
  51.         patt_table = re.compile('(.*)\\t(.*)\\t.*')
  52.         patt_gouci = re.compile('.*\\t.*')
  53.         patt_s = re.compile('(.*)\\t([\\x00-\\xff]{3})\\t.*')
  54.         for l in f:
  55.             if not patt_com.match(l) and not patt_blank.match(l):
  56.                 for _patt, _list in ((patt_conf, _attri), (patt_table, _table), (patt_gouci, _gouci)):
  57.                     if _patt.match(l):
  58.                         _list.append(l)
  59.                         break
  60.                         continue
  61.                 
  62.         
  63.         if not _gouci:
  64.             gouci_dict = { }
  65.             for line in _table:
  66.                 res = patt_s.match(line)
  67.                 if res:
  68.                     if gouci_dict.has_key(res.group(2)):
  69.                         if len(res.group(1)) > len(gouci_dict[res.group(2)]):
  70.                             gouci_dict[res.group(2)] = res.group(1)
  71.                         
  72.                     else:
  73.                         gouci_dict[res.group(2)] = res.group(1)
  74.                 gouci_dict.has_key(res.group(2))
  75.             
  76.             for key in gouci_dict:
  77.                 _gouci.append('%s\t%s' % (key, gouci_dict[key]))
  78.             
  79.             _gouci.sort()
  80.         
  81.         return (_attri, _table, _gouci)
  82.  
  83.     
  84.     def parse_pinyin(f):
  85.         _pinyins = []
  86.         patt_com = re.compile('^#.*')
  87.         patt_blank = re.compile('^[ \\t]*$')
  88.         patt_py = re.compile('(.*)\\t(.*)\\t(.*)')
  89.         patt_yin = re.compile('[a-z]+[1-5]')
  90.         for l in f:
  91.             if not patt_com.match(l) and not patt_blank.match(l):
  92.                 res = patt_py.match(l)
  93.                 if res:
  94.                     yins = patt_yin.findall(res.group(2))
  95.                     for yin in yins:
  96.                         _pinyins.append('%s\t%s\t%s' % (res.group(1), yin, res.group(3)))
  97.                     
  98.                 
  99.             res
  100.         
  101.         return _pinyins[:]
  102.  
  103.     
  104.     def parse_extra(f):
  105.         _extra = []
  106.         patt_com = re.compile('^###.*')
  107.         patt_blank = re.compile('^[ \\t]*$')
  108.         patt_extra = re.compile('(.*)\\t(.*)')
  109.         patt_s = re.compile('(.*)\\t([\\x00-\\xff]{3})\\t.*')
  110.         for l in f:
  111.             if not patt_com.match(l) and not patt_blank.match(l):
  112.                 if patt_extra.match(l):
  113.                     _extra.append(l)
  114.                 
  115.             patt_extra.match(l)
  116.         
  117.         return _extra
  118.  
  119.     
  120.     def pinyin_parser(f):
  121.         for py in f:
  122.             (_zi, _pinyin, _freq) = unicode(py, 'utf-8').strip().split()
  123.             yield (_pinyin, _zi, _freq)
  124.         
  125.  
  126.     
  127.     def phrase_parser(f):
  128.         list = []
  129.         for l in f:
  130.             (xingma, phrase, freq) = unicode(l, 'utf-8').strip().split('\t')
  131.             list.append((xingma, phrase, int(freq), 0))
  132.         
  133.         return list
  134.  
  135.     
  136.     def goucima_parser(f):
  137.         for l in f:
  138.             (zi, gcm) = unicode(l, 'utf-8').strip().split()
  139.             yield (zi, gcm)
  140.         
  141.  
  142.     
  143.     def attribute_parser(f):
  144.         for l in f:
  145.             
  146.             try:
  147.                 (attr, val) = unicode(l, 'utf-8').strip().split('=')
  148.             except:
  149.                 (attr, val) = unicode(l, 'utf-8').strip().split('==')
  150.  
  151.             attr = attr.strip()
  152.             origin_attr = attr
  153.             attr = attr.lower()
  154.             val = val.strip()
  155.             yield (attr, val)
  156.         
  157.  
  158.     
  159.     def extra_parser(f):
  160.         list = []
  161.         for l in f:
  162.             (phrase, freq) = unicode(l, 'utf-8').strip().split()
  163.             
  164.             try:
  165.                 _tabkey = db.parse_phrase_to_tabkeys(phrase)
  166.                 list.append((_tabkey, phrase, freq, 0))
  167.             continue
  168.             print '"%s" would not been added' % phrase.encode('utf-8')
  169.             continue
  170.  
  171.         
  172.         return list
  173.  
  174.     if opts.only_index:
  175.         debug_print('Only create Indexes')
  176.         debug_print('Optimizing database ')
  177.         db.optimize_database()
  178.         debug_print('Create Indexes ')
  179.         db.create_indexes('main')
  180.         debug_print('Done! :D')
  181.         return 0
  182.     debug_print('\tLoad sources "%s"' % opts.source)
  183.     patt_s = re.compile('.*\\.bz2')
  184.     _bz2s = patt_s.match(opts.source)
  185.     debug_print('\tParsing table source file ')
  186.     (attri, table, gouci) = parse_source(source)
  187.     debug_print('\t  get attribute of IME :)')
  188.     attributes = attribute_parser(attri)
  189.     debug_print('\t  add attributes into DB ')
  190.     db.update_ime(attributes)
  191.     db.create_tables('main')
  192.     debug_print('\t  get phrases of IME :)')
  193.     phrases = phrase_parser(table)
  194.     debug_print('\t  add phrases into DB ')
  195.     db.add_phrases(phrases)
  196.     if db.get_ime_property('user_can_define_phrase').lower() == u'true':
  197.         debug_print('\t  get goucima of IME :)')
  198.         goucima = goucima_parser(gouci)
  199.         debug_print('\t  add goucima into DB ')
  200.         db.add_goucima(goucima)
  201.     
  202.     if db.get_ime_property('pinyin_mode').lower() == u'true':
  203.         debug_print('\tLoad pinyin source "%s"' % opts.pinyin)
  204.         _bz2p = patt_s.match(opts.pinyin)
  205.         if _bz2p:
  206.             pinyin_s = bz2.BZ2File(opts.pinyin, 'r')
  207.         else:
  208.             pinyin_s = file(opts.pinyin, 'r')
  209.         debug_print('\tParsing pinyin source file ')
  210.         pyline = parse_pinyin(pinyin_s)
  211.         debug_print('\tPreapring pinyin entries')
  212.         pinyin = pinyin_parser(pyline)
  213.         debug_print('\t  add pinyin into DB ')
  214.         db.add_pinyin(pinyin)
  215.     
  216.     debug_print('Optimizing database ')
  217.     db.optimize_database()
  218.     if db.get_ime_property('user_can_define_phrase').lower() == u'true' and opts.extra:
  219.         debug_print('\tPreparing for adding extra words')
  220.         db.create_indexes('main')
  221.         debug_print('\tLoad extra words source "%s"' % opts.extra)
  222.         _bz2p = patt_s.match(opts.extra)
  223.         if _bz2p:
  224.             extra_s = bz2.BZ2File(opts.extra, 'r')
  225.         else:
  226.             extra_s = file(opts.extra, 'r')
  227.         debug_print('\tParsing extra words source file ')
  228.         extraline = parse_extra(extra_s)
  229.         debug_print('\tPreparing extra words lines')
  230.         db.cache_goucima()
  231.         debug_print('\t  Goucima has been cache to memory')
  232.         extrawds = extra_parser(extraline)
  233.         debug_print('\t  we have %d extra phrases from source' % len(extrawds))
  234.         orig_phrases = { }
  235.         (map,)((lambda x: orig_phrases.update({
  236. '%s\t%s' % (x[0], x[1]): x })), phrases)
  237.         debug_print('\t  the len of orig_phrases is: %d' % len(orig_phrases))
  238.         extra_phrases = { }
  239.         (map,)((lambda x: extra_phrases.update({
  240. '%s\t%s' % (x[0], x[1]): x })), extrawds)
  241.         debug_print('\t  the len of extra_phrases is: %d' % len(extra_phrases))
  242.         (None, map)((lambda x: if orig_phrases.has_key(x):
  243. extra_phrases.pop(x)0), extra_phrases.keys())
  244.         debug_print('\t  %d extra phrases will be added' % len(extra_phrases))
  245.         new_phrases = extra_phrases.values()
  246.         debug_print('\tAdding extra words into DB ')
  247.         db.add_phrases(new_phrases)
  248.         debug_print('Optimizing database ')
  249.         db.optimize_database()
  250.     
  251.     if opts.index:
  252.         debug_print('Create Indexes ')
  253.         db.create_indexes('main')
  254.     else:
  255.         debug_print("We don't create index on database, you should only active this function only for distribution purpose")
  256.         db.drop_indexes('main')
  257.     debug_print('Done! :D')
  258.  
  259. if __name__ == '__main__':
  260.     main()
  261.  
  262.